/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ssp.topology;

import java.util.HashSet;
import java.util.Set;

/**
 * トポロジにおけるエッジを表すクラス
 * @author yamazaki
 */
public class Edge {
    
    /**
     * 両端に接続するノードセット
     */
    private final Set<Node> connectedNodes;
    
    /**
     * リンクの重み
     */
    private final int weight;
    
    /**
     * コンストラクタ<br>
     * 重み1でEdgeを生成する
     * @param srcNode 接続ノード
     * @param dstNode 接続ノード
     */
    public Edge(Node srcNode, Node dstNode) {
        this(srcNode, dstNode, 1);
    }
    
    /**
     * コンストラクタ
     * @param srcNode 接続ノード
     * @param dstNode 接続ノード
     * @param weight リンク重み
     */
    public Edge(Node srcNode, Node dstNode, int weight) {
        this.connectedNodes = new HashSet<Node>(2);
        this.connectedNodes.add(srcNode);
        this.connectedNodes.add(dstNode);
        if(this.connectedNodes.size() > 2) {
            throw new IllegalArgumentException();
        }
        this.weight = weight;
    }

    /**
     * @return the neighborNodes
     */
    public Set<Node> getConnectedNodes() {
        return connectedNodes;
    }

    /**
     * @return the weight
     */
    public int getWeight() {
        return weight;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Edge other = (Edge) obj;
        if (this.connectedNodes != other.connectedNodes && (this.connectedNodes == null || !this.connectedNodes.equals(other.connectedNodes))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 47 * hash + (this.connectedNodes != null ? this.connectedNodes.hashCode() : 0);
        return hash;
    }
    
}
